package cn.kgc.javaweb.servlet.listener;

import cn.kgc.javaweb.entity.User;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.*;
import java.util.HashMap;
import java.util.Map;

/**
 * @author: mosin
 * @version: v1.0  2022/11/6
 * <p>
 * 监听session对象的值的改变
 */
@WebListener
public class SessionAttributeListener implements HttpSessionAttributeListener {

    /*
     *单点登录的思路分析
     * 1. 用户登录成功后 会向session域中添加一个key   user
     * 2. 向session对象中添加值时  会被 HttpSessionAttributeListener  attributeAdded
     * 3. 判定用户是否已经成功登录过一次    ->  Map<String(username) ,HttpSession (session) >  tom  session  ;jack session
     * 4. 用户已经登录  则根据用户名 从 map集合中取出对应的session销毁   第一次登录的用户就被剔除   再次请求后台接口时 会被拦截到登录页
     * 5. 将第二次用户登录的相关信息 存入 map集合   username  session
     * */
    private Map<String, HttpSession> map = new HashMap<>();

    // 添加值
    @Override
    public void attributeAdded(HttpSessionBindingEvent event) {
        System.out.println("session  attributeAdded");
        String name = event.getName();
        System.out.println("session name:" + name);

        if ("user".equals(name)) {
            //  需要将用户的名字 以及 对应的session对象存入map集合
            User user = (User) event.getValue();
            // 获取用户名
            String username = user.getUsername();
            if (map.containsKey(username)) {  //  判定用户是否已经登录
                //获取用户对应的session销毁
                HttpSession httpSession = map.get(username);
                httpSession.invalidate();
            }
            // 获取用户登录创建的新的session 存入map集合
            HttpSession session = event.getSession();
            map.put(username, session);
            System.out.println("map = " + map);
        }
    }

    // 删除值
    @Override
    public void attributeRemoved(HttpSessionBindingEvent event) {
        System.out.println("session  attributeRemoved");
    }

    // 替换值
    @Override
    public void attributeReplaced(HttpSessionBindingEvent event) {
        System.out.println("session  attributeReplaced");
    }
}
